{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = X = np.array([[5,1], [4,2], [2,5], [1,4], [3,2], [2,5]])#TODO\n",
    "\n",
    "y = np.array([0, 0, 1, 1, 0, 1]) #TODO  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-3 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-3 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-3 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-3 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-3 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-3 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-3 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-3 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-3 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-3 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-3 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-3\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-3\" type=\"checkbox\" checked><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;KNeighborsClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)# TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user)#TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAHJCAYAAACL5E3/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABgR0lEQVR4nO3deVxU9f7H8dewg4BriAsuuWHu5IZWWobrTckyf2ipqXXramlWptXNrdJuGdlmlqnVlSwrbXOJLDSXzI1SM1NTcUG9loKI4gjn98fEyMiADMwwML6fj8c8cr7zPd/z+cyB/Pg933OOyTAMAxEREZGrnJe7AxAREREpC1QUiYiIiKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkQgHDhzAZDJhMpkK7Tds2DBMJhOTJ08uncCcIDdmk8nEP//5zwL7ZWVlUaVKFWvfpKSk0gvyb7mxunLfSUlJ1hxzXz4+PoSHh9OvXz++//57l+07r+zsbJ555hkaNGiAn58fJpOJYcOGlcq+RaRgPu4OQERKx+LFi3nttdfw8/PL99nXX3/NqVOn3BCVe1SvXp2ePXsCcP78eZKTk/niiy/48ssveeONN3jwwQdduv9Zs2Yxbdo0atasSf/+/QkICOCGG25w6T5F5MpUFIlcBdq0acO2bdtYtmwZsbGx+T7/73//i7e3N82bN+fnn38u/QCB6dOnM2HCBOrUqePyfUVGRrJgwQLre8MwmDp1KpMnT+bRRx/ljjvuICwszGX7X7p0KQA//PAD1157rcv2IyKO0ekzkatAXFwcXl5eLFy4MN9np0+fZtmyZXTr1o3w8HA3RGdRo0YNIiMjCQoKKvV9m0wm/v3vf9OgQQPOnTvHN99849L9HT58GEAFkUgZo6JIpIQyMjKYPn06rVq1omLFigQHB9OgQQMGDBjAypUr8/XPzMxk+vTptGnThuDgYIKDg+nYsSPvvfee3fFNJhP16tXjwoULTJ06lcjISPz9/e3O+BSkRo0a3HLLLXz11VekpaXZfPbxxx+TlZXF3XffXegYhw4d4p///Cd169bF39+fsLAw+vfvz6ZNm2z6bd26FZPJRIcOHQoc67XXXsNkMjFu3DhrW2Frihz9zorDy8uLVq1aAZZc4dIapGHDhnHs2DFGjhxJ7dq18fHx4ZVXXrFue+jQIUaPHk2DBg0ICAigSpUq/OMf/2D9+vU2+8jNcf/+/QA2a5sOHDhQ7HyL8jNS3DGzs7N54YUXaNy4Mf7+/kRERPDEE0+QlZVld7uzZ8/ywgsv0LZtW0JDQ6lQoQKRkZGMGjWK33//PV//jRs3MmDAAGrUqIGfnx+1a9dm5MiRpKSk2B1fxJV0+kykBLKzs7n11lvZuHEj1apVo2vXrgQEBHD48GGWLVtGhQoV6NGjh7X/iRMniImJ4ZdffiE8PJwuXbpgGAbr169n2LBhbN68mddeey3ffnJycoiNjWXNmjV06dKFli1bUrVqVYdiHTx4MN9++y2ffvopw4cPt7YvXLiQoKAgbr/9drszSQDbt2/nlltu4eTJkzRp0oT+/fuTkpLCkiVL+PLLL0lISGDAgAEAREVFERkZyU8//cS+ffto0KBBvvFy93OlQgyK/50Vx5kzZwDw9/e3af/f//5Hu3btuHjxIjfccAPnz5+3zmht2LCBPn36cOrUKZo0aUKfPn343//+x8qVK1mxYgULFy5k4MCBANZ1Q5988glnz55l6NCh1n0EBweXKN/CfkZK8h0OGjSIZcuW0bVrV5o0acIPP/zAf/7zH44cOcJ///tfm76pqanExMSwc+dOKleuTNeuXfH39+ePP/7grbfeolGjRjRu3Nja/8033+Shhx4CoF27dtx4443s3r2bd999ly+++ILVq1fTtGnTIh49EScwRK5y+/fvNwDjSr8OQ4cONQBj0qRJ1rbvvvvOAIx27doZ586ds+mflpZmbN682aatd+/eBmCMGTPGOH/+vLX92LFjRtu2bQ3AWL58uc02ubE1bNjQOHz4sEO55cb8wQcfGOnp6UZgYKBx8803Wz8/ePCgYTKZjLi4OMMwDKNHjx4GYHz//ffWPjk5OUaLFi0MwBg/fryRk5Nj/eyTTz4xvLy8jODgYOPo0aPW9mnTphmAMXXq1Hwx7d271wCMyMhIu7Hm3bdhFO87K8j3339vAEaXLl3yfXb8+HEjNDTUAIzExESb/oBx++232z3GNWrUMLy9vY3//ve/Np9t2rTJqFy5shEcHGycOHHC5rO6desW+PPmip+RkozZtGlTIzU11dr+xx9/GJUqVTIAY+/evTbbdOvWzQCMu+66yzhz5ozNZ/v37zd+/vln6/sNGzYY3t7eRq1atfL9nsydO9cAjA4dOtj9jkRcRUWRXPVKUhR99NFHBmCMHTv2ivvZtm2btYDKzs7O9/nWrVsNwOjbt69Ne25sixcvLlpCdmL+4IMPDMMwjLvuusvw8vKy/sX5/PPPG4Dx9ddfG4ZhvyjKLfzq1KljXLhwId8++vfvbwDGs88+a237448/7BY+hmEYU6ZMMQBj2rRpdmPNu+/ifmcFsVcUnTt3zvjxxx+NDh06GIDRpEkT4+LFizb9/f397RYb8fHxBmA8+uijdvf38ssvG4Dx8ssv27QXVBS54mekpGPmFoh5jR492gCM+fPnW9s2btxoAEZYWJiRnp6eb5vL9evXzwCML7/80u7nffv2NQBj69atVxxLxFm0pkikBFq3bo2Xlxfz58/nnXfe4c8//yywb+7i3djYWLy88v/q5a71+Omnn/J9ZjKZuO2220oc7913301OTg4JCQmA5TRWWFgY3bt3L3CbH374AYC77roLX1/ffJ/fc889Nv0A6tevT6dOnfjtt9/YunWrTf/cU2eDBw++Yrwl+c4Ks3r1autansDAQDp27MjGjRtp2LAhS5cuxdvb26Z/VFQUtWrVKjC+/v37293PjTfeCFDk+FzxM1KSMX19fbn55pvzteeeAktNTbW2ffvtt4BlUX9ISIjd/HLl5OSwatUqgoKCbE4v5+XodyfiDCqK5Kp3pZs25jIMI1//xo0b85///IfMzEzuv/9+wsLCaNWqFePGjeOXX36x2T53Ie1TTz2V7waCua+MjAxOnjyZb99hYWH51rkUR8+ePalatSoLFy5k27Zt7Ny5k4EDB+LjU/DywqNHjwJQr149u5/nth85csSmPbfoybtOafPmzfz+++906tSJ+vXrXzHeknxnhalevTpDhw5l6NChjBgxgvHjx/PZZ5/x66+/EhkZma9/QbcJyI2vc+fOdmNr164dQJHjc8XPSEnGDA8Pz1cgAtaiJ+9i69zF6fbWkF3u5MmTZGRkkJmZab155eWvxx9/3NpXpLRoobVc9fJeAp6ZmVngJeGZmZkAVKhQwab90Ucf5a677mLp0qUkJibyww8/EB8fzyuvvEJ8fDxjxowBLP86Bsti26L8xZFXQECAQ/0L4uvry1133cXs2bN58skngaItdi5MQUXlwIEDGTt2LIsWLeLFF1+0uSVAUWaJoGTfWWEuv0/RlRT0/efGd+edd+b7ubh8f0Xhip+Rkoxpb2bJGXJjCg4O5o477ii0b7NmzVwSg4g9KorkqlelShUCAwM5d+4cf/zxB82bN7fb748//gCgdu3a+T6LiIjgoYce4qGHHuLixYssWrSIe++9l/HjxzNkyBAqV65s3S42NpZHH33UdQldwd13383s2bNZsWIFjRs3pn379oX2r1mzJgAHDx60+3nuTMTlp5eqVq1Kjx49+Oqrr0hKSqJLly4sWrQIX19f69VYV1JWvrOC1K5dm927dzNhwgSuv/56p4wHzs23tL7DiIgIAPbt23fFvtWqVSMgIMB66rmos7UirqbTZ3LV8/b2pnPnzoDlcRf2HDp0iOTkZLy8vKx9C+Lj48Pdd99Nu3btuHDhAnv27AEgJiYGgCVLljgxesd16tSJVq1aUbVqVZtL8wuSu7Zj8eLFZGdn5/s897Ls3H555c4IJSQk8N1333Hs2DF69OhR5NsJlJXvrCDOjs8V+ZbWd3jrrbcC8OGHH5KRkVFoXx8fH7p27Up6ejqrVq1yaVwijlBRJALWU1wzZsxg48aNNp+lpaUxfPhwcnJy6N+/v/VfxADff/893377rfV0QK79+/eza9cuTCaT9V/qHTp0ICYmhnXr1jFq1CjS09PzxfHzzz+zYsUKZ6eXT3JyMidPnuSJJ564Yt+uXbvSokULDhw4wDPPPGNdWwWWv2g/++wzgoOD7RZY/fr1IyQkhE8//ZR58+YBRT91BmXrO7Pnn//8J2FhYfznP//h7bffzvdzcPHiRVauXMmOHTuKNJ4r8i2t77B9+/bcfPPNnDhxgvvvv5+zZ8/afH7gwAG2b99uff/UU0/h5eXFvffea/eGnRkZGcybN49z586VKC4Rh7j78jeRsmL8+PEGYHh5eRnR0dHGoEGDjD59+hgVK1Y0AKN58+b57jeTe0n2NddcY/Ts2dMYPHiw0b17d8Pf398AjIceesim//Hjx402bdoYgFGpUiWja9eu1v1ERERY7yWTF2DUrVu3WDldfkn+ldi7JN8wDOOXX34xqlatar1vTVxcnNG5c2cDMHx8fIyPPvqowDGHDBlivbw7JCTEyMzMLDTWy/ddnO+sIIXdp6iw/kOHDi2wz4YNG4xq1aoZgBEREWH06tXLGDRokHHLLbdY7+ezZMkSm20Ku0+RK35GnD3m/Pnz892ewjAM4/Dhw0aTJk0MwKhSpYrRt29fY8CAAUZUVJTh5eVlxMfH2/SfPXu24e3tbf396t+/vzFw4ECjQ4cO1t+hU6dOFZiXiLOpKBLJY/ny5Ua/fv2M8PBww8fHxwgNDTXat29vvPDCC0ZGRka+/nv27DGefvppo3PnzkaNGjUMPz8/o1atWka3bt2MTz/91OZGh7nOnTtnvPrqq0anTp2MihUrGn5+fkZERITRpUsX48UXXzQOHTpk078sFEWGYbnR43333WdEREQYvr6+RrVq1YzY2Fhj48aNhY65cuVKa1E0ZMiQK8Zqb9+OfmcFcUVRZBiGkZqaaowfP95o1qyZERQUZAQFBRkNGjQw+vXrZyxYsCDfjQwLK4oMwzU/I84cs6CiyDAMIz093Zg6darRsmVLIzAw0AgODjYiIyON0aNHG3v27MnXf9u2bcbQoUONunXrGn5+fkalSpWMZs2aGcOHDze++uoru79DIq5iMow8c+EiIiIiVymtKRIRERFBRZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJFGjPn3vwmuLF2pS1pbrfjAsZ+Ez14f2f3y/V/YqIXO2uukvyc3JyOHr0KCEhIXrejhTqpoU3cdZ8li3DtgDw2e+f8e81/yY1I5VsIxs/Lz+61+/Owr4LrzCSrd4f92bdkXU2bb5evpwcc+lp4EO/GkpSShIH/2X/eWMiIlcbwzA4c+YMNWvWdNnDiq+6oujw4cM2j2kQsSsQGA98AWz7u60fEP73++NAc6At8Cuw2IGxhwG1gbfztGUDf+Z5XxEYCywCdjsavIiI5zp06JDdB3M7g49LRi3DQkJCAMuXGhoa6tSxzWYz33zzDd27d8fX19epY5cFnp4fXMpxbdBaZifP5nTS6UL7d3y/I0ejjpIyN6XI++j9cW+2HNvC8T3HC+1X5806XPfodawY6Lznenn6MfT0/MDzc1R+5Z+rckxPTyciIsL697grXHVFUe4ps9DQUJcURUFBQYSGhnrkD7un5weXclx7dC1Vg6pe8WfkXPY5gv2CHfpZ8vHx4Xz2eSq/Uhkvkxe1Qmrx4R0fEh0RbdMvslokv5781ak/p55+DD09P/D8HJVf+efqHF259EULrUXsOH72OJUDKhfaZ87mORw4fYBR7UY5NPYt9W/hkY6P8NGdHzG5y2T+PPcnN86/kaPpR2361QqpxVnz2QJGERERZ7vqZopEiuJizkX8vf0L/HzJriU8+PWDdKvfjYk3TnRo7Ge6PGPz/u6Wd1NvVj2e/O5JFsQusLZX8K1Adk62Q2OLiEjxaaZIxI5gv2DOXDhj97Mvdn/BHR/fQXTtaL4d8m2J91W3Ul2CfIPYfdJ2RfX/Mv+Hn7dficcXEZGiUVEkYkeza5px/Gz+hdCf//Y5sYtiaVuzLetGrLOzpeOOZRzjnPkcNUNq2rTv/nN3vjYREXEdFUUidgxpOYTzF8+z/9R+a9uSXUu4/aPbqVepHnP7zuWX47/wy/Ff2PW/XQ6N3fbttsz6cRZrU9YyZ/Mcmr3ZDIBnb3nWpl9KWgrdr+1e8mRERKRItKZIxI7+kf2p4FuBp797moV3WG7OOGvjLAwM9p/eT6u3Wln7epu8ufjMRQDWpqzlxvk3Et8jnrEdx9od+8TZE4z7Zhw5Ro716rPFAxbT9Jqm1j5vb3mbHCOH57s977okRUTEhooikQI8Fv0Y09dN572c9/Dx8iFpWNIVt/npyE+YMNGvSb8C+6Q8cuV7Gj275lluvfZWqgRVcSRkEREpAZ0+EynA5Jsn07thb7Yc3VLkbT7c/iG9GvaifuX6xd5vxoUMGldtzKI7FhV7DBERcZxmikQKseT/ljjUf9P9m0q8z2C/YKdc1SYiIo7RTJFc9U5knKD/R/3xf9afijMqAhC7KNZmkbWIiHg+txZFkydPxmQy2bwiIyML3Wbx4sVERkYSEBBAixYtWLZsWSlFK55o/6n91HmlDkt+W8KF7AvW9u8PfE+j1xqx8fBGN0YnIiKlye0zRc2aNSM1NdX6Wrt2bYF9169fT1xcHCNGjGDbtm3ExsYSGxvLjh07SjFi8SQ3v3czWdlZdj/LNrLp8d8epRyRiIi4i9uLIh8fH8LDw62vatWqFdh31qxZ9OzZk8cff5ymTZsybdo0oqKieP3110sxYvEUO47v4GDawUL7pGWl8flvn5dSRCIi4k5uX2i9Z88eatasSUBAANHR0UyfPp06derY7bthwwbGjRtn09ajRw+WLl1a4PhZWVlkZV2aCUhPTwcsT/E1m80lTyCP3PGcPW5Z4Wn5Ld21lECvQJu2QFMA137xBdVr+HP870efffnbl/Ru0NsNETqfpx3Dy3l6fuD5OSq/8s9VOZbGd2YyDMNw+V4KsHz5cjIyMmjSpAmpqalMmTKFI0eOsGPHDkJCQvL19/Pz47333iMuLs7a9uabbzJlyhSOH8//SAawrFuaMmVKvvaEhASCgoKcl4x4hPrLltHy7bc5W706mx97jNONGrk7JBERATIzMxk0aBBpaWmEhoa6ZB9unSnq1auX9c8tW7akQ4cO1K1bl48//pgRI0Y4ZR8TJ060mV1KT08nIiKC7t27O/1LNZvNJCYmEhMTg6+vr1PHLgs8Lb+jZ47S9I2mNm2dvXxZGhZGhePHiZ7wOE929+X2N76jfe0OborSuTztGF7O0/MDz89R+ZV/rsox90yPK7n99FlelSpVonHjxuzdu9fu5+Hh4flmhI4fP054eHiBY/r7++Pv75+v3dfX12U/kK4cuyzwlPzqVqlL07CmbD221dq2riYkvfwm5ueHEPtrDi8tN8O4mTBvHlSu7MZonctTjmFBPD0/8PwclV/55+wcS+P7cvtC67wyMjLYt28fNWrUsPt5dHQ0q1atsmlLTEwkOjq6NMITD7T63tVUr1Ddpu1icDCDBvrx6G3+GH5+sHQptGkDP/3kniBFRKRUuLUoeuyxx1i9ejUHDhxg/fr13H777Xh7e1vXDA0ZMoSJEyda+48ZM4YVK1Ywc+ZMfvvtNyZPnszmzZsZPXq0u1KQci7YL5jD4w7z7M3PUjukNhV8KwAwtuMjPPfZaUwbNkCDBnD4MFy4cIXRRESkPHNrUXT48GHi4uJo0qQJd911F1WrVuXHH3/kmmuuASAlJYXU1FRr/06dOpGQkMDbb79Nq1at+OSTT1i6dCnNmzd3VwriAXy8fHjqpqc4NO4QRx89CsCUm6cQ4BMAUVGwdSt8+inccMOljbKz3RStiIi4ilvXFC1aVPgDL5OSkvK1DRgwgAEDBrgoIhE7QkOhX56n3v/6K9x+O8ydCzfe6L64RETEqcrUmiKRcuHf/4bff4ebb4bnn4ecHHdHJCIiTqCiSMRR770Hd99tOYX21FPQqxecOOHuqEREpIRUFIk4KjgY3n8f3n0XAgPhm2+gdWuwc7pXRETKDxVFIsVhMsHw4bBpE1x3HaSmQrdu8N137o5MRESKqUzdvFGk3GnWzHL/oocegr174aab3B2RiIgUk4oikZKqUMFyx+vMTPD5+1cqK8syi5T3Mn4RESnTdPpMxFnyPmD4iScss0ZPPw0XL7ovJhERKTIVRSLOlpNjmSkyDHjuOctaoyNH3B2ViIhcgYoiEWfz8oLZs+HDDyEkBNassVydtmKFuyMTEZFCqCgScZX/+z/YssXyMNmTJy33M5owAcxmd0cmIiJ2qCgScaVGjWD9ehg1yvJ+9mw4etS9MYmIiF26+kzE1QIC4PXXLY8F8fKCunXdHZGIiNihokiktNxxh+37b76xrDOaMQP8/NwTk4iIWKkoEnGHjAy45x7LM9PWrYNFi6B+fXdHJSJyVdOaIhF3CA6Gt9+GSpUsd8Ru0waWLHF3VCIiVzUVRSLu0q8fJCdDx46Qlgb9+8PDD1vucSQiIqVORZGIO9Wta7mP0eOPW96/9hp07gxnzrg3LhGRq5CKIhF38/WF//wHvvoKqlaF5s0tN30UEZFSpYXWImVFnz6W02mVK19qO3XKckl/YKDbwhIRuVpopkikLKldGypUsPw5JwcGD7asOdq9271xiYhcBVQUiZRVBw/C5s3wyy9w/fWwcKG7IxIR8WgqikTKqvr14eefoWtXOHsW7r4bRo6EzEx3RyYi4pFUFImUZTVqwLffwqRJYDLBu+9C+/bw66/ujkxExOOoKBIp67y9YfJkS3EUHg47d8LAgZY1RyIi4jQqikTKi1tusVyd1qcPzJtnebisiIg4jS7JFylPqle33M8or0WLoFkzaNHCPTGJiHgI/VNTpDxLToahQy3rjN55BwzD3RGJiJRbKopEyrNatSyn1c6fh/vvh0GDID3d3VGJiJRLKopEyrNrroGvv4YXXrAsyF60yHJPo23b3B2ZiEi5o6JIpLzz8oLx4y0Plo2IgL17LXfBfustd0cmIlKuqCgS8RSdOllmiG67DS5cgL/+cndEIiLlSpkpimbMmIHJZGLs2LEF9lmwYAEmk8nmFRAQUHpBipR1VavC55/DRx/BhAmX2i9edF9MIiLlRJm4JH/Tpk3MmTOHli1bXrFvaGgou/M8HNNkMrkyNJHyx2SCu+669P7cObjxRrjnHnjwQffFJSJSxrl9pigjI4PBgwfzzjvvULly5Sv2N5lMhIeHW1/Vq1cvhShFyrH33oMtW2DsWLzvvBPfM2fcHZGISJnk9pmiUaNG0adPH2699VaeffbZK/bPyMigbt265OTkEBUVxfPPP0+zZs0K7J+VlUVWVpb1ffrflyubzWbMZnPJE8gjdzxnj1tWeHp+4KE5Dh+OV1YWXuPH4/Xll3T98Ueya9eGzp3dHZnTeeTxu4yn56j8yj9X5Vga35nJMNx3t7dFixbx3HPPsWnTJgICAujatSutW7fmlVdesdt/w4YN7Nmzh5YtW5KWlsZLL73EmjVr2LlzJ7Vr17a7zeTJk5kyZUq+9oSEBIKCgpyZjkiZVnHvXtq+9BLBx46R4+3Nr/fcw76+ffW4EBEpFzIzMxk0aBBpaWmEhoa6ZB9uK4oOHTpE27ZtSUxMtK4lulJRdDmz2UzTpk2Ji4tj2rRpdvvYmymKiIjg5MmTTv9SzWYziYmJxMTE4Ovr69SxywJPzw88P0fzyZOcGjCAWuvWAZA9YQI5U6e6OSrn8fTjB56fo/Ir/1yVY3p6OtWqVXNpUeS202dbtmzhxIkTREVFWduys7NZs2YNr7/+OllZWXh7exc6hq+vL23atGHv3r0F9vH398ff39/utq76gXTl2GWBp+cHHpxjtWpsfuwxwuPi8J4+He9Ro/D2wDw99vjl4ek5Kr/yz9k5lsb35bZ5827durF9+3aSk5Otr7Zt2zJ48GCSk5OvWBCBpYjavn07NWrUKIWIRTyEyUTO/fdbbvKY97Tzt99CTo774hIRcTO3zRSFhITQvHlzm7YKFSpQtWpVa/uQIUOoVasW06dPB2Dq1Kl07NiRhg0bcvr0aV588UUOHjzIyJEjSz1+kXIv7z2+vvgC+vWD7t3hgw8gLMx9cYmIuEmZXmGZkpJCamqq9f2pU6e47777aNq0Kb179yY9PZ3169dz3XXXuTFKEQ9w5gwEBsI330Dr1pCU5O6IRERKndsvyc8r6bL/EV/+Pj4+nvj4+NILSORqMXiwpRgaMAB27YJu3WDSJHjqKcuDZkVErgJleqZIREpRs2awaRPce69lbdGkSZbTaceOuTsyEZFSoaJIRC6pUAHmzYP334egIPjuO/j78n0REU9Xpk6fiUgZcc890K6d5eGyd9zh7mhEREqFZopExL7ISHjiiUvvU1PhzjvhyBH3xSQi4kIqikSkaB54AD791LIge8UKd0cjIuJ0KopEpGhefNFSEJ08Cb16wYQJ4MEPtRSRq4+KIhEpmsaNYcMG+Ne/LO9feAG6doVDh9waloiIs6goEpGiCwiAN96Ajz+G0FBYv94ye7R5s7sjExEpMRVFIuK4AQNg61a4/nrLI0EiI90dkYhIiemSfBEpngYNLPcwOn4cgoMtbTk5lps91qzp3thERIpBM0UiUnz+/lCnzqX38fGWO2MvWeK+mEREiklFkYg4R06O5WaPp09D//7w8MOQleXuqEREikxFkYg4h5cXrFoFjz1mef/aa9C5M+zb5964RESKSEWRiDiPr6/lfkZffQVVq8KWLdCmjeVqNRGRMk5FkYg4X58+kJxsmSk6cwbuvhsOHnR3VCIihdLVZyLiGrVrQ1ISPPOM5bL9unXdHZGISKE0U+Qif2b+SdiLYRw4faDU991xbkc+/fXTUt+vSD4+PvD88zB27KW2n3+GhATX7/vPPy3F2IEDrt9XXhcuQL16uqGlSDmkoshFnvvhOfo16Ue9SvWsbQ8vf5jr374e/2f9af1W6xLvY9GORZimmIhdFGvT/vRNTzNh1QRyjJwS70PEqTIy4K67YPBgGDkSMjNdt6/nnoN+/SwFCliKpJ49LfdQ8veHiAgYPRrS04u/jxkzwGSyLfr8/CyLzZ94oiTRi4gbqChygUxzJu9ue5cRUSPyfTa89XAGNhtY4n0cOH2Ax755jBvr3Jjvs14Ne3Em6wzL9ywv8X5EnCogAP7v/yyFxLvvQocOsGuX8/eTmWkZf0Se30EvL0uR9MUX8PvvsGABfPstPPBA8faxaRPMmQMtW+b/bPBgWLsWdu4s3tgi4hYqilxg+d7l+Hv707F2R5v2V3u9yqj2o7i28rUlGj87J5vBnw1mStcpdsfy9vKmd6PeLNq5qET7EXE6Hx+YMgUSE6F6ddixA9q2hffec+puTMuXW2aDOub5HaxcGR580LK/unWhWzfLw21/+MHxHWRkWAqfd96xjHu5ypUti8wX6XdQpDxRUeQC6w6t4/qa17ts/KmrpxJWIczuTFSu9rXa88PBYvzPXqQ0dOtmuTqtWzfLrM6wYTB0KJw/75ThTevWWZ7LVpijR+Gzz6BLF8d3MGqU5Qq7W28tuE/79sUruETEbVQUucDB9IPUDHbNs5/Wpqzl3W3v8s5t7xTar2ZITQ6lH9K6Iim7wsNh5UqYNs1yauvoUct9jpzAdPBgwc9fi4uDoCCoVQtCQ2HuXMcGX7TI8jDc6dML71ezpm5DIFLOqChygfPm8wT4BDh93DNZZ7hnyT28c9s7VAuqVmjfQJ9Acowcsi7qMQtShnl7w9NPw/ffw3//a3kPcPEiGEbxxz1/3rJ+yZ74eEtR8/nnlrttjxtX9HEPHYIxY2DhwoLHzxUY6NqF5CLidLpPkQtUDarKqfOnnD7uvlP7OHD6ALd9eJu1LXcmyGeqD7tH76ZBlQYA/HXuLyr4ViDQN9DpcYg43U032b4fNcpy08c5cyAkxPHxqlaFUwX8DoaHW16RkVClCtx4I/z731CjxpXH3bIFTpyAqKhLbdnZsGYNvP665VlvuYXdX3/BNdc4HruIuI2KIhdoXb01H+780OnjRlaLZPuD223anv7uac5cOMOsnrOIqBhhbd9xYgdtarRxegwiLrd7t+XKsexsy71+Pv4YWrd2aAijdWv4sAi/gzl/n14u6oNru3WD7ba/g9x7r6XAeuKJSwURWBaRt9HvoEh5oqLIBWKujeHppKc5de4UlQMvXZmy96+9ZFzI4FjGMc5dPEfysWQArrvmOvy8/a44boBPAM3Dmtu0VQqoBJCv/YeUH+h+bfeSJSLiDk2awOrVlkv39+yxXEEWH2+5dN5kKtIQOTExeD/9tGW2KPfqsGXL4PhxaNcOgoMtl8s//rjlKrHcexldSUgINLf9XaNCBcvM1OXtP/xgWS8lIuWG1hS5QIuwFkTViOLjnbYPwRz5xUjazGnDnC1z+P3P32kzpw1t5rTh6Jmj1j6mKSYWJC8o0f6PpB9h/aH13Nvm3hKNI+I2nTtbrk77xz8sszj/+hcMHAhpaUXbvkULyymuvA+iDQy0XEJ/ww3QtCk88gj07Wt5eG2uAwcshVdSUsni37DBEuudd5ZsHBEpVZopcpFnbnqGxxMf577r78PLZKk9k4YlFbrN/lP78fHyoXNE5yLvZ0Hsgnxtr258lWGth1E7tLYjIYuULVWrWm60GB9vOTW1eLGlaNm4sWgzRs88Y5kJuu8+y9VtN98M69cXvs3+/VCpErRqVfQ47RVQr7xi2Xeg1vSJlCcqilykT+M+7PlrD0fSj9is9SnMsj3LuD/qfhpVbVSifYdVCGNctANX1IiUVSaT5eqwzp0tp9OeeabIp9Do08dy+u3IEcsjPYpi2TJ48kn7N2QsqgsXLDNVjzxS/DFExC1UFLnQ2I5jHeo/qv0op+z30U6POmUckTKjQwf47TfLXapzjRxpeeDr888XvF3uM8mmTbMs3J48ufD9vPhiSSO1PPvs6adLPo6IlDqtKSohwzBYsmsJt7x3C3VeqQPAIyse4beTv7k5MhEPk7cgSkmBhATLDRTvv7/w7aZNs8ww5b0yTETEjjJTFM2YMQOTycTYvE+btmPx4sVERkYSEBBAixYtWLZsWekEaIdhGPzzq3/S/+P+rDm4hrTzlkWg7//yPq3easWKvSvcFpuIR0tLu3RfoXfegZ497d/sMbcgmjrVci8iEZFClImiaNOmTcyZM4eW9p42ncf69euJi4tjxIgRbNu2jdjYWGJjY9mxY0cpRWrrg18+4J2tlsdtZBvZ1vaLORcxZ5u54+M7OHXO+TdxFLnqtWhhuSv1gAGW9ytXWu4V9Oefl/qoIBIRB7m9KMrIyGDw4MG88847VL7C4sZZs2bRs2dPHn/8cZo2bcq0adOIiori9ddfL6VobcX/GG+9suxyBgbnzOd472fnPv1bRP5WsSJ89BHMng0+PvD77/g0aUKVXbvweu45FUQi4jC3L7QeNWoUffr04dZbb+XZZ58ttO+GDRsYd9lzinr06MHSpUsL3CYrK4usPHerTU9PB8BsNmM2m4sd98Wci+w+sRt/kz/8fTFMoFegzX+9TF5sOrypRPspS3Lz8JR87PH0HD0yvxEj4Prr8enZE9Nff9H5ySfxMgyyJ00iZ8IE8KRc8dBjmIfyK/9clWNpfGduLYoWLVrE1q1b2bRpU5H6Hzt2jOrVq9u0Va9enWPHjhW4zfTp05kyZUq+9m+++YagoCDHAr7Mhy3tP0ZgXvN5Nu/due7JFRITE90dgst5eo6emJ/PG2/Qa9AgS0Hk48NXbdpYLrH3UJ54DPNSfuWfs3PMLIUHLLutKDp06BBjxowhMTGRgCs9bboEJk6caDO7lJ6eTkREBN27dyc0NLREY9+WcBvrDq2zricK9ApkXvN5DN8xnHM55wB4s8+bDG4xuET7KSvMZjOJiYnExMTg6+vr7nBcwtNz9OT8vJ57zloQeV+8yD+2bSPnqafcHZbTefIxBOXnCVyVY+6ZHldyW1G0ZcsWTpw4QVSep01nZ2ezZs0aXn/9dbKysvC+7BLa8PBwjh8/btN2/PhxwsPDC9yPv78//nkv5f2br69viQ/W2M5jWblwZb72cznnuGBcoFpQNQa2GOhxP/jO+O7KOk/P0ePymzYNpkwhe9IkvmrThn9s24b3lCmW/4d46JoijzuGl1F+5Z+zcyyN78ttC627devG9u3bSU5Otr7atm3L4MGDSU5OzlcQAURHR7Nq1SqbtsTERKKjo0srbBs9G/ZkZveZAPh4XaovTZioHFiZlXevJNBXt/kXcak8V5nlzgzlPPWUZZH1M8/ooawiUmRumykKCQmh+WVPla5QoQJVq1a1tg8ZMoRatWoxffp0AMaMGUOXLl2YOXMmffr0YdGiRWzevJm333671OPPNS56HD0a9OCtzW/xy7FfAJhx6wzuaXOP9Qn2IuIil192n3chZu4M0TPP2L4XESmA268+K0xKSgpeXpcmszp16kRCQgJPP/00Tz75JI0aNWLp0qX5iqvS1iysGa/1fg2z2cyyZct4oO0DHj8tKuJ2RbkPkQojEXFAmSqKki572vTl7wEGDBjAgNwbtonI1Ss7u2j3Icr9PDu78H4ictUrU0WRiEiRXenhrnlphkhEisDtd7QWERERKQtUFImIiIigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAoCPoxuMGzfObrvJZCIgIICGDRvSr18/qlSpUuLgREREREqLw0XRtm3b2Lp1K9nZ2TRp0gSA33//HW9vbyIjI3nzzTd59NFHWbt2Ldddd53TAxYRERFxBYdPn/Xr149bb72Vo0ePsmXLFrZs2cLhw4eJiYkhLi6OI0eOcNNNN/HII49ccazZs2fTsmVLQkNDCQ0NJTo6muXLlxfYf8GCBZhMJptXQECAoymIiIiI5OPwTNGLL75IYmIioaGh1raKFSsyefJkunfvzpgxY3jmmWfo3r37FceqXbs2M2bMoFGjRhiGwXvvvUe/fv3Ytm0bzZo1s7tNaGgou3fvtr43mUyOpiAiIiKSj8NFUVpaGidOnMh3aux///sf6enpAFSqVIkLFy5ccazbbrvN5v1zzz3H7Nmz+fHHHwssikwmE+Hh4Y6GLSIiIlIoh4uifv36MXz4cGbOnEm7du0A2LRpE4899hixsbEA/PTTTzRu3NihcbOzs1m8eDFn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xAho1869sUnR/OMfsG8fvP32pRs2PvoojBx5qeAVKQ1unSmaPXs2aWlpdO3alRo1alhfH+V5VHFKSgqpuXdkAzp16kRCQgJvv/02rVq14pNPPmHp0qU0b97cHSmISBlQoYLlL9Dci1Bfe00FUXlTqxZMmQIrVljeP/WUCiIpfW6dKSrKhW9JSUn52gYMGMCAAQNcEJGIiIhcrfTsMxERERFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBHBzUbRmzRpuu+02atasiclkYunSpYX2T0pKwmQy5XsdO3asdAIWERERj+XWoujs2bO0atWKN954w6Htdu/eTWpqqvUVFhbmoghFRETkauHjzp336tWLXr16ObxdWFgYlSpVcn5AIiIictVya1FUXK1btyYrK4vmzZszefJkOnfuXGDfrKwssrKyrO/T09MBMJvNmM1mp8aVO56zxy0rPD0/8PwclV/55+k5Kr/yz1U5lsZ3ZjIMw3D5XorAZDKxZMkSYmNjC+yze/dukpKSaNu2LVlZWcydO5cPPviAjRs3EhUVZXebyZMnM2XKlHztCQkJBAUFOSt8ERERcaHMzEwGDRpEWloaoaGhLtlHuSqK7OnSpQt16tThgw8+sPu5vZmiiIgITp486fQv1Ww2k5iYSExMDL6+vk4duyzw9PzA83NUfuWfp+eo/Mo/V+WYnp5OtWrVXFoUlcvTZ3m1b9+etWvXFvi5v78//v7++dp9fX1d9gPpyrHLAk/PDzw/R+VX/nl6jsqv/HN2jqXxfZX7+xQlJydTo0YNd4chIiIi5ZxbZ4oyMjLYu3ev9f3+/ftJTk6mSpUq1KlTh4kTJ3LkyBHef/99AF555RXq169Ps2bNOH/+PHPnzuW7777jm2++cVcKIiIi4iHcWhRt3ryZm2++2fp+3LhxAAwdOpQFCxaQmppKSkqK9fMLFy7w6KOPcuTIEYKCgmjZsiXffvutzRgiIiIixeHWoqhr164Uts57wYIFNu/Hjx/P+PHjXRyViIiIXI3K/ZoiEREREWdQUSQiIiKCiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopERETERf78E8LC4MCB0t93x47w6aeObaOiSERERFziueegXz+oV+9Sm8mU/7VokWPjrlkDt90GNWtatl+6NH+fp5+GCRMgJ6fo46ooEhEREafLzIR334URI/J/Nn8+pKZeesXGOjb22bPQqhW88UbBfXr1gjNnYPnyoo/r41gYIiIiIle2fLkJf3/LaazLVaoE4eHFH7tXL8urMN7e0Lu3ZRaqT5+ijauZIhEREXG6detMXH+9/c9GjYJq1aB9e5g3DwzDNTG0bw8//FD0/popEhEREac7eNBEzZr526dOhVtugaAg+OYb+Ne/ICMDHn7Y+THUrAmHDlnWFXkVYRpIRZGIiIg43fnzEBCQv/3f/7705zZtLOuDXnzRNUVRYKClIMrKsvz5SnT6TERERJyualU4derK/Tp0gMOHLYWLs/31F1SoULSCCFQUiYiIiAu0bm3w669X7pecDJUrg7+/82PYscMyG1VUOn0mIiIiThcTk8PTT3tz6pSl6AH48ks4ftxyRVpAACQmwvPPw2OPOTZ2Rgbs3Xvp/f79luKqShWoU+dS+w8/QPfuRR9XM0UiIiLidC1aQFQUfPzxpTZfX8u9haKjoXVrmDMHXn4ZJk261OfAAcsNGZOSCh5782bLDFDuLNC4cZY/P/PMpT5HjsD69XDvvUWPWTNFIiIi4hLPPAOPPw733We5+qtnT8urMPv3W+5j1KpVwX26dr3yZfyvvgrDhkHt2kWPV0WRiIiIuESfPrBnj2XWJiKiaNssWwZPPnnplFtxhYVZZpAcoaJIREREXGbsWMf6v/iic/b76KOOb6M1RSIiIlIi2dmwcCF06nRpRuippyzrg8oTtxZFa9as4bbbbqNmzZqYTCaW2nvM7WWSkpKIiorC39+fhg0bsmDBApfHKSIiIvZdvAh33AF33w0bN0J6uqV99mzLYusff3RvfI5wa1F09uxZWrVqxRuFPeY2j/3799On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nU3fvn0L3OfgwYOpVq0a/fr144cffmD//v0kJSXx8MMPc/jwYbvbvPvuu9x55500b97c5jVixAhOnjzJihUrHMq7UaNGfPDBB+zatYuNGzcyePBgAgMDbfrUq1ePVatWcezYsWIXMZGRkdx6663cf//9/PTTT2zbto3777/f7uyViJQOFUUiUqDQ0FBCQ0ML/HzGjBnccccd3HPPPURFRbF3715WrlyZb13M4MGD+fnnn7n99tvzFRh5BQUFsWbNGurUqUP//v1p2rQpI0aM4Pz583bj2LJlCz///DN33HFHvs8qVqxIt27dePfddx3I2FJknTp1iqioKO655x7rLQfymjlzJomJiUREROS7TYEj3n//fapXr85NN93E7bffzn333UdISAgBAQHFHlNEis9kGIbh7iBERAQOHz5MREQE3377Ld26dXN3OCJXHRVFIiJu8t1335GRkUGLFi1ITU1l/PjxHDlyhN9//z3fIm0RcT1dfSYi4iZms5knn3ySP/74g5CQEDp16sTChQtVEIm4iWaKRERERNBCaxERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERAP4fCVaWpDbjGR4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "colors = ['blue' if label == 0 else 'green' for label in y]\n",
    "plt.scatter(X[:, 0], X[:, 1], c=colors, label='Original data')\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=8, label='New data')\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "nearest = X[idx[0][0]]# 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y, color in zip(X[:, 0], X[:, 1], colors):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})', color=color)\n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})',color='red')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.5"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
